#include "Instructor.h"

using std::endl;
using std::cerr;
using std::cout;
using std::string;

Instructor::Instructor(string nombre_usuario, string clave, char* ip_serv, char* puerto, char* puerto_av)
									:Usuario(nombre_usuario, clave, ip_serv, puerto, puerto_av) {
	en_clase = false;
}

void Instructor::crearCurso() {}

int Instructor::crearClase(std::string codClase, std::string nombreClase) {
	bool envio_ok;
	char cod_op = 'C';
	int tam_arg = codClase.size() + nombreClase.size() + 2;
	cout << codClase << endl;
	envio_ok = this->socket->enviar(&cod_op, sizeof(cod_op));
	if(!envio_ok)
		std::cerr << "no se pudo enviar" << std::endl;
	envio_ok = this->socket->enviar(&tam_arg, sizeof(tam_arg));
	if(!envio_ok)
		std::cerr << "no se pudo enviar" << std::endl;
	envio_ok = this->socket->enviar(codClase.c_str(), codClase.size() + 1);
	if(!envio_ok)
		std::cerr << "no se pudo enviar" << std::endl;
	envio_ok = this->socket->enviar(nombreClase.c_str(), nombreClase.size() + 1);
	if(!envio_ok)
		std::cerr << "no se pudo enviar" << std::endl;
	std::cout << "Crear clase : " << nombreClase << " Codigo: " << codClase << std::endl;
	clases.push_back(codClase);
	return 0;
}

int Instructor::iniciarClase(std::string codClase) {
	char cod_op = 'A';
	int tam_arg = codClase.size() + 1;
	std::list<std::string>::iterator it;
	for(it = clases.begin(); it != clases.end(); it++) {
		if((!en_clase) && (it->compare(codClase) == 0)) {
			if(!this->socket->enviar(&cod_op, sizeof(cod_op))) {
				std::cerr << "No se pudo iniciar la clase" << std::endl;
				return -1;
			}
			if(!this->socket->enviar(&tam_arg, sizeof(tam_arg))) {
				std::cerr << "No se pudo iniciar la clase" << std::endl;
				return -1;
			}
			if(!this->socket->enviar(codClase.c_str(), codClase.size() + 1)) {
				std::cerr << "No se pudo iniciar la clase" << std::endl;
				return -1;
			}
			std::cout << "Se envio el codigo para iniciar la clase" << std::endl;
			en_clase = true;
			emisorDeVideo = new EmisorDeFrames(socket_av, &en_clase);
			// Corre el hilo de "captura de frames"
			emisorDeVideo->start();
		}
	}
	return 0;
}

int Instructor::terminarClase(std::string codClase) {
	char cod_op = 'B';
	int tam_arg = codClase.size() + 1;
	if(en_clase) {
		std::cout << "Terminar la clase con código: " << codClase << std::endl;
		en_clase = false;
		emisorDeVideo->pararTransmision();
		if(!this->socket->enviar(&cod_op, sizeof(cod_op))) {
			std::cerr << "No se pudo terminar la clase" << std::endl;
			return -1;
		}
		if(!this->socket->enviar(&tam_arg, sizeof(tam_arg))) {
			std::cerr << "No se pudo terminar la clase" << std::endl;
			return -1;
		}
		if(!this->socket->enviar(codClase.c_str(), codClase.size() + 1)) {
			std::cerr << "No se pudo terminar la clase" << std::endl;
			return -1;
		}
		//emisorDeVideo->join();
		delete emisorDeVideo;
	}
	return 0;
}

void Instructor::crearHiloReceptor(ReproductorVideo *reproductorVideo) {
	//receptor = new Receptor(socket_receptorChat);
	//this->reproductorVideo = reproductorVideo;
}

void Instructor::adjuntar() {}

Instructor::~Instructor() {
	if(en_clase) {
		emisorDeVideo->join();
		delete emisorDeVideo;
	}
}
